package com.bestcem.xm.member.dao;

import com.bestcem.xm.member.entity.pojo.ProjectDO;
import com.bestcem.xm.member.service.dto.ProjectMemberDto;
import com.bestcem.xm.member.service.param.ProjectManagerDynamicSql;

import javax.annotation.Nullable;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * @author dc.wang <dc.wang@idiaoyan.com>
 * @version V1.0
 * @description 联系人项目持久层接口
 * @date 2021/7/13
 */
public interface ProjectDao {
    /**
     * 校验是否存在该名称的项目
     *
     * @param orgId       企业标识
     * @param projectName 项目名称
     * @return true 存在
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/7/19
     */
    @Deprecated
    @NotNull
    boolean existsProjectName(@NotNull String orgId, @NotBlank String projectName);

    /**
     * 校验是否存在该编号的项目
     *
     * @param orgId       企业标识
     * @param projectCode 项目编号
     * @return true 存在
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/7/19
     */
    @Deprecated
    @NotNull
    boolean existsProjectCode(@NotNull String orgId, @NotBlank String projectCode);

    /**
     * 查询具有相同名称或编号的项目
     *
     * @param orgId       企业id
     * @param projectName 项目名称
     * @param projectCode 项目编号
     * @return true 存在
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/9/16
     */
    ProjectDO findByNameOrCode(@NotNull String orgId, @NotBlank String projectName, @NotBlank String projectCode);

    /**
     * 查询项目id对应的项目
     *
     * @param orgId 企业id
     * @param id    项目id
     * @return 如果不存在，返回null
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/9/16
     */
    @Nullable
    ProjectDO findById(@NotNull String orgId, @NotNull String id);

    /**
     * 查询项目ids对应的项目
     *
     * @param orgId 企业标识
     * @param ids   项目id集合
     * @return 如果不存在，返回EmptyList
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/9/16
     */
    @Nullable
    List<ProjectDO> findByIds(@NotNull String orgId, @NotEmpty Collection<String> ids);

    /**
     * 查询项目ids对应的项目
     * 注：该接口未校验企业id
     *
     * @param ids 项目id集合
     * @return 如果不存在，返回EmptyList
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/9/16
     */
    @Nullable
    List<ProjectDO> findByIds(@NotEmpty Collection<String> ids);

    /**
     * 查询名称对应的项目
     *
     * @param orgId 企业标识
     * @param name  项目名称
     * @return 项目信息
     * @author yf.wang <yf.wang@idiaoyan.com>
     * @date 2021/9/16
     */
    @Nullable
    ProjectDO findByName(@NotNull String orgId, @NotNull String name);

    /**
     * 查询编号对应的项目
     *
     * @param orgId 企业标识
     * @param code  项目编号
     * @return 项目信息
     * @author yf.wang <yf.wang@idiaoyan.com>
     * @date 2021/9/16
     */
    List<ProjectDO> findByCode(String orgId, String code);

    /**
     * 查询联系人项目数
     *
     * @param orgId    企业标识
     * @param memberId 联系人标识
     * @return 项目数量
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/9/16
     */
    Integer countByMemberId(@NotNull String orgId, @NotNull String memberId);

    /**
     * 分页查询联系人项目
     *
     * @param orgId    企业id
     * @param memberId 联系人id
     * @param offset   偏移量
     * @param size     大小
     * @return 如果不存在，返回EmptyList
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/9/16
     */
    @NotNull
    List<ProjectDO> listByMemberId(@NotNull String orgId, @NotNull String memberId, @NotNull Integer offset, @NotNull Integer size);

    /**
     * 查询condition结果
     *
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/8/16
     */
    @NotNull
    Integer countProjectManagerByDynamicSql(ProjectManagerDynamicSql dynamicSql);

    /**
     * 查询condition结果
     *
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/7/19
     */
    @NotNull List<ProjectMemberDto> listProjectManagerByDynamicSql(ProjectManagerDynamicSql dynamicSql);

    /**
     * 创建联系人项目
     *
     * @param project 项目信息
     * @return 已创建的项目
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/9/16
     */
    @NotNull
    ProjectDO insert(@NotNull ProjectDO project);

    /**
     * 更新项目信息
     * 注：覆盖所有列
     *
     * @param project 项目信息
     * @return 更新列数
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/9/16
     */
    @Nullable
    Integer update(@NotNull ProjectDO project);

    /**
     * 删除id对应的项目
     *
     * @param id 项目标识
     * @return 删除数量
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/9/16
     */
    Integer deleteById(@NotBlank String orgId, @NotBlank String id);

    /**
     * 删除id集合中包含的项目
     *
     * @param ids 项目id集合
     * @return 删除数量
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/9/16
     */
    Integer batchDeleteByIds(@NotNull String orgId, @NotEmpty List<String> ids);

    /**
     * 删除企业对应的所有项目
     *
     * @param orgId 企业标识
     * @author yf.wang <yf.wang@idiaoyan.com>
     * @date 2021/9/16
     */
    void deleteByOrgId(@NotBlank String orgId);

    /**
     * 批量删除扩展字段
     */
    void batchDeleteExtendFields(@NotNull String orgId, @NotEmpty Collection<String> fieldIds);

    /**
     * 批量修改扩展字段名
     */
    void batchUpdateFieldName(String orgId, Map<String, String> fieldIdAndNameMap);

    /**
     * 修改扩展字段枚举值
     */
    void updateMemberFieldEnumValue(String orgId, String fieldId, Object oldValue, Object newValue);

    /**
     * 根据orgId memberId projectName 获取数据
     *
     * @param orgId
     * @param mid
     * @param projectName
     * @return
     */
    ProjectDO findOneByOrgIdAndMemberIdAndName(String orgId, String mid, String projectName);

    /**
     * 删除 机构联系人绑定的项目
     *
     * @param orgId
     * @param insMemberIds
     */
    void deleteByMemberIds(String orgId, List<String> insMemberIds);

    /**
     * 校验联系人中是否存在该名称的项目
     *
     * @param orgId       企业标识
     * @param memberId    联系人标识
     * @param projectName 项目名称
     * @param projectCode 项目编号
     * @return true 存在
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/7/19
     */
    boolean existsMemberProjectNameOrCode(String orgId, String memberId, String projectName, String projectCode);

    /**
     * 根据公司id查询项目
     *
     * @param orgId 公司id
     * @return 项目列表
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 15:19 2022/3/28
     */
    List<ProjectDO> listByOrgId(String orgId);

    Integer batchInsert(List<ProjectDO> projects);
}
